var Block = Class.create();
Block.prototype = {
	patternWidth : 5,
	patternHeight : 5,
	pattern : null,
	patternWork : null,
	cellWidth : 16,
	cellHeight : 16,
	img : null,

	initialize : function(img) {
		this.img = img;
		this.setRandomBlock();
	},

	setRandomBlock : function() {
		this.pattern = new Array(this.patternHeight);
		for (var y = 0; y < this.patternHeight; y++) {
			this.pattern[y] = new Array(this.patternWidth);
		}

		this.patternWork = new Array(this.patternHeight);
		for (var y = 0; y < this.patternHeight; y++) {
			this.patternWork[y] = new Array(this.patternWidth);
		}
		
		for (var y = 0; y < this.patternHeight; y++) {
			for (var x = 0; x < this.patternWidth; x++) {
				this.pattern[y][x] = new Cell();
			}
		}
		
		var patternNum = Math.floor(Math.random() * 6);
		
		switch (patternNum) {
			// I-テトリミノ(水色) 
			// 　　　　　
			// 　　　　　
			// ■■■■　
			// 　　　　　
			// 　　　　　
			case 0:
				this.pattern[0][2].setCell(patternNum);
				this.pattern[1][2].setCell(patternNum);
				this.pattern[2][2].setCell(patternNum);
				this.pattern[3][2].setCell(patternNum);
				break;
				
			// O-テトリミノ(黄色)  
			// 　　　　　
			// 　■■　　
			// 　■■　　
			// 　　　　　
			// 　　　　　
			case 1:
				this.pattern[1][1].setCell(patternNum);
				this.pattern[1][2].setCell(patternNum);
				this.pattern[2][1].setCell(patternNum);
				this.pattern[2][2].setCell(patternNum);
				break;
				
			// S-テトリミノ(黄緑)
			// 　　　　　
			// 　　■■　
			// 　■■　　
			// 　　　　　
			// 　　　　　
			case 2:
				this.pattern[1][2].setCell(patternNum);
				this.pattern[1][3].setCell(patternNum);
				this.pattern[2][1].setCell(patternNum);
				this.pattern[2][2].setCell(patternNum);
				break;
				
			// Z-テトリミノ(赤)
			// 　　　　　
			// 　■■　　
			// 　　■■　
			// 　　　　　
			// 　　　　　
			case 3:
				this.pattern[1][1].setCell(patternNum);
				this.pattern[1][2].setCell(patternNum);
				this.pattern[2][2].setCell(patternNum);
				this.pattern[2][3].setCell(patternNum);
				break;
				
			// J-テトリミノ(青)
			// 　　　　　
			// 　■　　　
			// 　■■■　
			// 　　　　　
			// 　　　　　
			case 4:
				this.pattern[1][1].setCell(patternNum);
				this.pattern[2][1].setCell(patternNum);
				this.pattern[2][2].setCell(patternNum);
				this.pattern[2][3].setCell(patternNum);
				break;
				
			// L-テトリミノ(オレンジ)
			// 　　　　　
			// 　　　■　
			// 　■■■　
			// 　　　　　
			// 　　　　　
			case 5:
				this.pattern[1][3].setCell(patternNum);
				this.pattern[2][1].setCell(patternNum);
				this.pattern[2][2].setCell(patternNum);
				this.pattern[2][3].setCell(patternNum);
				break;
			
			// T-テトリミノ(紫) 
			// 　　　　　
			// 　　■　　
			// 　■■■　
			// 　　　　　
			// 　　　　　
			case 6:
				this.pattern[1][2].setCell(patternNum);
				this.pattern[2][1].setCell(patternNum);
				this.pattern[2][2].setCell(patternNum);
				this.pattern[2][3].setCell(patternNum);
				break;
		}
	},

	draw : function(ctx, blockX, blockY) {
		for (var y = 0; y < this.patternHeight; y++) {
			for (var x = 0; x < this.patternWidth; x++) {
				this.pattern[y][x].draw(ctx, this.img, blockX + x, blockY + y);
			}
		}
	},
	
	isHit : function(x, y) {
		return !this.pattern[y][x].isEmpty();
	},
	
	getColor : function(x, y) {
		return this.pattern[y][x].getColor();
	},
	
	rotateLeft: function() {
		for (var y = 0; y < this.patternHeight; y++) {
			for (var x = 0; x < this.patternWidth; x++) {
				this.patternWork[this.patternHeight - x - 1][y] = this.pattern[y][x];
			}
		}
		for (var y = 0; y < this.patternHeight; y++) {
			for (var x = 0; x < this.patternWidth; x++) {
				this.pattern[y][x] = this.patternWork[y][x];
			}
		}
	},
	
	canRotateLeft : function(field, blockX, blockY) {
		for (var y = 0; y < this.patternHeight; y++) {
			for (var x = 0; x < this.patternWidth; x++) {
				this.patternWork[this.patternHeight - x - 1][y] = this.pattern[y][x];
			}
		}
		
		for (var y = 0; y < this.patternHeight; y++) {
			for (var x = 0; x < this.patternWidth; x++) {	
				if (field.isHit(x + blockX, y + blockY)) {
					return false;
				}
			}
		}
		
		return true;
	},
	
	rotateRight : function() {
		for (var y = 0; y < this.patternHeight; y++) {
			for (var x = 0; x < this.patternWidth; x++) {
				this.patternWork[this.patternHeight - x - 1][y] = this.pattern[y][x];
			}
		}
		for (var y = 0; y < this.patternHeight; y++) {
			for (var x = 0; x < this.patternWidth; x++) {
				this.pattern[y][x] = this.patternWork[y][x];
			}
		}
	},
	
	canrotateRight : function(field, blockX, blockY) {
		for (var y = 0; y < this.patternHeight; y++) {
			for (var x = 0; x < this.patternWidth; x++) {
				this.patternWork[this.patternHeight - x - 1][y] = this.pattern[y][x];
			}
		}
		
		for (var y = 0; y < this.patternHeight; y++) {
			for (var x = 0; x < this.patternWidth; x++) {	
				if (field.isHit(x + blockX, y + blockY)) {
					return false;
				}
			}
		}
		
		return true;
	}
};